from flask import get_flashed_messages, request, flash, render_template, redirect, url_for, session
from models.proyectoManager import ProyectoManager
from models.faseManager import FaseManager
from models.itemManager import ItemManager
import datetime

from models.historialAtributoManager import HistorialAtributoManager
from models.historialRelacionManager import HistorialRelacionManager

proyectoMgr = ProyectoManager()
faseMgr = FaseManager()
itemMgr= ItemManager()
historialRelacionMgr = HistorialRelacionManager()
historialAtributoMgr = HistorialAtributoManager()

"""
Clase que contiene los metodos relacionados con la creacion de reportes
"""

def gestionarReportes():
    """ Metodo encargado de la gestion de los tres tipos de reportes permitidos"""
    if request.method == "POST":
        if request.form["operacion"] != "":
            operacion = request.form["operacion"]
            idproyecto = session['idproyecto'] 
            return redirect(url_for(operacion, idproyecto=idproyecto)) 
        else:
            idproyecto = request.form["idproyecto"]
            proyecto = proyectoMgr.getProyecto(idproyecto)
            return render_template("reportes.html", proyecto=proyecto, idproyecto=idproyecto)
    else:
        if request.args.getlist("operacion"):
            idproyecto = request.form["idproyecto"]
            proyecto = proyectoMgr.getProyecto(idproyecto)
            fases = proyecto.fases
            return redirect(url_for("gestionarReportes", method='POST', operacion=operacion, idproyecto=request.args.getlist("idproyecto")[0]))

        if session['idproyecto']: 
            idproyecto = session['idproyecto']
            proyecto = proyectoMgr.getProyecto(idproyecto)
            return render_template("reportes.html", proyecto=proyecto, idproyecto=idproyecto)
        else:
            flash(u"Seleccionar un proyecto antes de realizar la operaci\u00f3n", "error")
            return redirect(url_for("configurarProyecto", action="gestionarReportes"))
        

     
def reporteItemsPorFase():
    """ Metodo encargado de crear un reporte que liste las fases del proyecto con sus respectivos items """
    fecha = datetime.date.today()
    if request.method == "POST":
        idproyecto = request.form["idproyecto"]
        proyecto = proyectoMgr.getProyecto(idproyecto)
        fases = faseMgr.getFasesPorProyecto(idproyecto)
        return render_template("reporteItemsPorFase.html",idproyecto=idproyecto, proyecto=proyecto, fases=fases, fecha=fecha, bandera='1')
    if request.method == "GET":
        idproyecto = request.args.getlist("idproyecto")[0]
        proyecto = proyectoMgr.getProyecto(idproyecto)
        fases = faseMgr.getFasesPorProyecto(idproyecto)
        return render_template("reporteItemsPorFase.html",idproyecto=idproyecto, proyecto=proyecto, fases=fases, fecha=fecha, bandera='1')

    
def reporteSolicitudes():
    """ 
    Metodo encargado de crear un reporte que liste todas las solicitudes de cambio del proyecto, 
    los items afectados por ella y sus respectivos datos 
    """
    fecha = datetime.date.today()
    if request.method == "POST":
        idproyecto = request.form["idproyecto"]
        proyecto = proyectoMgr.getProyecto(idproyecto)
        solicitudes = proyectoMgr.getSolicitudesDelProyecto(idproyecto)
        return render_template("reporteSolicitudes.html",idproyecto=idproyecto, proyecto=proyecto, solicitudes=solicitudes, fecha=fecha, bandera='1')
    if request.method == "GET":
        idproyecto = request.args.getlist("idproyecto")[0]
        proyecto = proyectoMgr.getProyecto(idproyecto)
        solicitudes = proyectoMgr.getSolicitudesDelProyecto(idproyecto)
        return render_template("reporteSolicitudes.html",idproyecto=idproyecto, proyecto=proyecto, solicitudes=solicitudes, fecha=fecha, bandera='1')


def reporteHistorial():
    """ Metodo encargado de crear un reporte que muestre el historial de cambios de un determinado item """
    fecha = datetime.date.today()
    if request.method == "POST":
        if request.form["iditem"]:
            idproyecto = request.form["idproyecto"]
            proyecto = proyectoMgr.getProyecto(idproyecto)
            iditem = request.form["iditem"]
            item = itemMgr.getItem(iditem)
            items = itemMgr.getItemsDelProyecto(idproyecto)
            historial = item.historial
            historialRelaciones = []
            historialAtributos = []
            for h in historial:
                ha = historialAtributoMgr.getHistorialAtributos(h.idhistorialitem)
                historialAtributos.append(ha)
            for h in historial:
                hr = historialRelacionMgr.getPadres(h)
                historialRelaciones.append(hr)
            return render_template("reporteHistorial.html", idproyecto = idproyecto, proyecto=proyecto, items=items, fecha=fecha, item=item, bandera='1', historial=historial, historialRelaciones=historialRelaciones, historialAtributos=historialAtributos)
        return redirect(url_for("gestionarReportes", idproyecto = request.form["idproyecto"]))
    if request.method == "GET":
        idproyecto = request.args.getlist("idproyecto")[0]
        proyecto = proyectoMgr.getProyecto(idproyecto)
        items = itemMgr.getItemsDelProyecto(idproyecto)
        return render_template("reporteHistorial.html",idproyecto=idproyecto, proyecto=proyecto, items=items, fecha=fecha, bandera='1')
    
def retornarAtributos(historial):    
    historialAtributos = historialAtributoMgr.getHistorialAtributos(historial.idhistorialitem)
    return historialAtributos
    
def retornarPadres(historial): 
    padres = historialRelacionMgr.getPadres(historial)
    return padres
    
    
    